define(function(){
	return function animate(ele,options,callBack){
		
		stop(); //每次调用函数，都需要清除掉之前的定时器
		for(let item in options){
			//opacity的值为小数，所以不能使用parsesInt,如果使用0-1的数值，那么使用sin时会非常费劲
			let originalValue = (item == "opacity") ? getComputedStyle(ele)[item]*10 : parseInt(getComputedStyle(ele)[item]); //获取元素的初始值,需要parseint，因为left有px
			let targetValue = options[item]; //获取传入元素的目标位置
			let distanc = targetValue - originalValue; //总共移动的距离
			let degree = 0; //初始度数
			
			ele[item + "-times"] = setInterval(function(){ //ele[item + "-times"]为数组添加自定义属性
				degree += 3;
				
				//最后再把*10，除回来
				if(item == "opacity") ele.style[item] = (originalValue + Math.sin(degree*Math.PI/180) * distanc) /10;
				else ele.style[item] = originalValue + Math.sin(degree*Math.PI/180) * distanc + "px";  //style是一个对象,里面存放的是{left：“”，right：“”}等，样式对象
				
				if(degree == 90){
					clearInterval(ele[item + "-times"]);
					
					//当调用多个回调函数时，可能会引发不必要的错误
					//判断定时器是否全部关闭
					ele[item + "-times"] = "stop";
					let allover = true ;
					for(let item in options){
						if(ele[item + "-times"] !== "stop"){
							allover = false;
							break;
						}
					}
					allover ? (callBack ? callBack():"") : "";
	//				callBack ? callBack():""; //判断是否调用了回调函数
				}
				
			},50);
			
		}
		
		function stop(){
			for(let item in options){
				clearInterval(ele[item + "-times"])
			}
		}
		
	}
})